#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name：    conftest.py
   Author :       zyq
   CreateDate：   2024/7/12 11:58
   Remark :  Python descriptor
-------------------------------------------------
"""

"""
conftest.py测试框架pytest的胶水文件，里面用到了fixture的方法，封装并传递出了driver。
test_pytest.fixture 这个实现了和unittest的setup，teardown一样的前置启动，后置清理的装饰器。

管理数据库连接，全局管理我们的driver
"""

import pytest
import time
import os

# from config.conf import ConfigManager
# from selenium import webdriver

from guitesting.common import DriverTool

DATE_FORMAT = '%Y-%m-%d %H:%M:%S'


@pytest.fixture(scope='class', autouse=False)
def drivers():
    """
    用于在pytest会话期间设置和清理Chrome WebDriver实例的fixture。

    Args:
        该函数不接受任何参数。

    Returns:
        webdriver.Chrome: 返回一个已初始化的Chrome WebDriver实例。

    """
    driver = DriverTool.get_driver()
    yield driver
    DriverTool.close_driver()


@pytest.fixture(scope='function')
def clear_cookies(drivers):
    """
    清除浏览器cookie
    Args:
        driver (webdriver.Chrome): 浏览器驱动对象。
    Returns:
        无返回值，但此函数使用了yield关键字，可以在其执行完成后执行一些清理工作。
    """
    yield
    # 清除浏览器cookie
    # driver = DriverTool.get_driver()
    drivers.delete_all_cookies()
    print('清除浏览器cookie')
    drivers.refresh()
    time.sleep(2)


@pytest.fixture(scope='function', autouse=False)
def open_zhuifeng(drivers):
    """
    打开追风网址

    Args:
        drivers (webdriver.Chrome): 浏览器驱动对象。 是调用的固件
    """
    drivers.get(ConfigManager.ZHUIFENG)
    yield


@pytest.fixture(scope="module")
def login(browser):
    """
    登录操作
    例子：当多个测试用例都需要登录操作时，可以在conftest.py中定义一个登录的fixture
    """
    page = browser.new_page()
    # 执行登录操作...
    yield page
    # 可能的登出操作或清理工作...


@pytest.fixture(scope="session")
def db_connection():
    """
    数据库连接
    例子：在测试前建立数据库连接，并在测试后关闭连接。
    """
    # 连接到数据库...
    # yield connection
    # 关闭数据库连接...


@pytest.fixture(scope="function")
def test_data():
    """
    数据准备: 为测试用例准备所需的数据，如测试用户、测试数据等。
    """
    # 准备测试数据...
    # return test_data


@pytest.fixture(scope="session")
def api_url():
    """
    环境变量
    例子：设置或获取环境变量，如API的URL、密钥等。
    """
    return os.getenv("API_URL", "http://localhost:8000")


@pytest.fixture(scope='session', autouse=True)
def timer_session_scope():
    """
    用于计算测试总耗时（session 作用域）。在测试会话期间自动执行的fixture，用于计算测试会话的总运行时间。

    Args:
        无参数。

    Returns:
        无返回值，但此fixture使用了yield关键字，可以在其执行完成后执行一些清理工作。

    """
    start = time.time()
    print('\n开始时间（start）: {}'.format(time.strftime(DATE_FORMAT, time.localtime(start))))

    yield

    finished = time.time()
    print('完成时间（finished）: {}'.format(time.strftime(DATE_FORMAT, time.localtime(finished))))
    print('测试会话总运行时间（Total time cost）: {:.3f}s'.format(finished - start))


@pytest.fixture(autouse=True)
def timer_function_scope():
    """
    统计每个函数运行时间（function 作用域），一个自动使用的pytest fixture，用于计算每个测试函数执行的时间。

    Args:
        无参数。

    Returns:
        无返回值，但使用了yield关键字，使得fixture在执行完成后能够执行后续操作。

    Note:
        在测试函数执行前记录开始时间，并在测试函数执行完成后打印出执行时间（以秒为单位，保留3位小数）。
    """
    start = time.time()
    yield
    print('测试函数执行时间(Time cost): {:.3f}s'.format(time.time() - start))


if __name__ == '__main__':
    # Drivers()
    timer_session_scope()
